const original = {
  name: "MDN",
  money: 123n, // bigint类型
//   b: Symbol('b'),
  c: null,
  d: undefined,
  e() {
    console.log(1);
  },
  f:new Date(),
  g:new RegExp(/^\d+$/),
  h:{
    person:{
        name:'tom',
        age:24
    }
  }
};
original.itself = original; // 循环引用

// let temp=structuredClone(original)
// console.log(temp);
// console.log(typeof temp.g);
// console.log(temp.g===original.g);

function deepClone(originalobj){
    function clone(obj){
        if(obj===null||typeof obj!=='object'){
            // 这里对于函数将会直接返回其引用
            // 对于普通数据类型也会直接返回
            return obj
        }

        // 拷贝日期对象和正则表达式
        if(obj instanceof Date){
            return new Date(obj.toString())
        }else if(obj instanceof RegExp){
            return new RegExp(obj.source,obj.flags)
        }

        if(hash.has(obj)){
            // 出现循环引用，则直接返回其拷贝的对象
            return hash.get(obj)
        }

        // 拷贝对象或数组
        const result=Array.isArray(obj)?[]:{}
        hash.set(obj,result)

        for(const key of Object.keys(obj)){
            result[key]=clone(obj[key])
        }

        return result
    }

    const hash=new Map()
    return clone(originalobj)
}

const test=deepClone(original)
console.log(test);
console.log(test.h===original.h);   // false
console.log(test.h.person===original.h.person); // false



